import axios from 'axios'
import { errorHandler } from './request'
import 'vant/es/toast/style'

/**
 * 定义接口响应包装类
 */
// export const BaseResponse = {
//   // wanAndroid-API响应体
//   errorCode,
//   errorMsg
//   // 拓展xxx-API响应体  
// }

/**
 * 接口实现类包装，例如有其他业务可以再次继承实现xxxResponse
 */
// export const ApiResponse = {
//   // wanAndroid-API响应体
//   data
//   // 拓展xxx-API响应体
// }

/**
 * 封装后，不支持传入拦截器
 * 需要自己定义接口继承 AxiosRequestConfig类型
 * 从而支持传入拦截器，但拦截器选项应为可选属性
 * 之后请求实例传入的options为继承了AxiosRequestConfig的自定义类型
 */
// const InterceptorHooks = {
//   requestInterceptor: (config) => HttpRequestConfig,
//   requestInterceptorCatch: (error) => any,
//   responseInterceptor: (response) => AxiosResponse,
//   responseInterceptorCatch: (error) => any,
// }

// const HttpRequestConfig = {
//   // 是否展示请求loading
//   showLoading,
//   // 是否检验响应结果码
//   checkResultCode,
//   // 校验用户登陆状态
//   checkLoginState,
//   // 是否需要跳转到登陆页面
//   needJumpToLogin,
//   interceptorHooks,
// }


class HttpRequest {

  config
  interceptorHooks
  instance

  constructor(options) {
    this.config = options;
    this.interceptorHooks = options.interceptorHooks;
    this.instance = axios.create(options);
    this.setupInterceptor()
  }

  setupInterceptor() {
    this.instance.interceptors.request.use(
      this.interceptorHooks?.requestInterceptor,
      this.interceptorHooks?.requestInterceptorCatch
    );
    this.instance.interceptors.response.use(
      this.interceptorHooks?.responseInterceptor,
      this.interceptorHooks?.responseInterceptorCatch
    );
  }

  // 类型参数的作用，T决定AxiosResponse实例中data的类型
  request(config) {
    return new Promise((resolve, reject) => {
      this.instance
        .request(config)
        .then(res => {
          resolve(res);
        })
        .catch((err) => {
          console.log('request方法>>>>>>>' + err)
          errorHandler(err)
          if (err) {
            reject(err);
          }
        });
    });
  }

  get(config) {
    return this.request({...config, method: 'GET'})
  }

  post(config) {
    return this.request({...config, method: 'POST'})
  }

  delete(config) {
    return this.request({...config, method: 'DELETE'});
  }

  patch(config) {
    return this.request({...config, method: 'PATCH'});
  }
}

export default HttpRequest
